#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>

struct Point {
    long long x, y;
};

int N, K;
std::vector<Point> points;

// 判定函数：使用 O(N^2) DP 检查是否存在长度至少为 K 的子序列，
// 使得任意两点斜率不小于 C
bool check(double C) {
    // 1. 计算每个点的转换值 z[i] = y[i] - C * x[i]
    std::vector<double> z(N);
    for (int i = 0; i < N; ++i) {
        z[i] = static_cast<double>(points[i].y) - C * static_cast<double>(points[i].x);
    }

    // 2. O(N^2) DP 求解最长非递减子序列 (LNDS)
    std::vector<int> dp(N);
    int max_len = 0; // 记录 LNDS 的全局最大长度

    for (int i = 0; i < N; ++i) {
        dp[i] = 1; // 初始化 dp[i] = 1
        for (int j = 0; j < i; ++j) {
            if (z[j] <= z[i]) {
                dp[i] = std::max(dp[i], dp[j] + 1);
            }
        }
        max_len = std::max(max_len, dp[i]);
    }

    // 3. 判断最长长度是否满足要求
    return max_len >= K;
}

int main() {
    // 开启快速 I/O
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    // --- 【关键修正】 ---
    // 从输入中直接读取 N 和 K
    std::cin >> N >> K; 

    points.resize(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> points[i].x >> points[i].y;
    }
    
    // 如果 K=1，问题没有意义，选任意一个点都行，斜率可以认为是无穷大。
    // 但题目要求选 "不同" 的两个点，所以 K 至少为 2。
    // 如果 K<2，直接退出或按题意处理。这里我们假设 K>=2。
    if (K < 2) {
        // 根据题目具体要求处理，这里简单退出
        return 0;
    }

    // 二分答案的范围
    double low = -2e9, high = 2e9; 
    
    // 进行足够多次数的二分以保证精度
    for (int iter = 0; iter < 100; ++iter) {
        // --- 【写法优化】 ---
        // 使用更稳健的 mid 计算方式
        double mid = low + (high - low) / 2.0; 
        if (check(mid)) {
            // mid 可行，答案可能更大，尝试提高下界
            low = mid;
        } else {
            // mid 不可行，答案必须更小，降低上界
            high = mid;
        }
    }

    // 输出结果，设置精度
    std::cout << std::fixed << std::setprecision(10) << low << std::endl;

    return 0;
}
